home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Freeware / Miro 1.0 / Miro_Installer.exe / xulrunner / chrome / toolkit.jar / content / global / nsWidgetStateManager.js < prev    next >
Encoding:
JavaScript  |  2005-02-01  |  10.2 KB  |  351 lines

  1. //@line 39 "/c/mozilla/toolkit/content/nsWidgetStateManager.js"
  2.  
  3. //@line 46 "/c/mozilla/toolkit/content/nsWidgetStateManager.js"
  4.  
  5. var wsm;
  6.  
  7. // For panels displayed inside the main dialog, this value will be the child iframe
  8. // window. For panels displayed in sub-dialogs, those launched by panels of the main
  9. // dialog, this will be the sub dialog window. 
  10. var gCurrentWindow = null;
  11.  
  12. function nsWidgetStateManager (aFrameID)
  13. {
  14.  
  15.   this.dataManager = {
  16.     /** Persisted Data Hash Table
  17.      *  Page_ID -> Element_ID -> Property -> Value
  18.      **/
  19.     pageData: { },
  20.  
  21.     setPageData: function (aPageTag, aDataObject)
  22.     {
  23.       this.pageData[aPageTag] = aDataObject;
  24.     },
  25.  
  26.     getPageData: function (aPageTag)
  27.     {
  28.       if (!(aPageTag in this.pageData))
  29.         this.pageData[aPageTag] = { };
  30.  
  31.       if (!('elementIDs' in this.pageData[aPageTag]))
  32.         this.pageData[aPageTag].elementIDs = new Object();
  33.  
  34.       if (!('userData' in this.pageData[aPageTag]))
  35.         this.pageData[aPageTag].userData = new Object();
  36.  
  37.       return this.pageData[aPageTag];
  38.     },
  39.  
  40.     setItemData: function (aPageTag, aItemID, aDataObject)
  41.     {
  42.       if (!(aPageTag in this.pageData))
  43.         this.pageData[aPageTag] = new Object();
  44.       
  45.       this.pageData[aPageTag].elementIDs[aItemID] = aDataObject;
  46.     },
  47.  
  48.     getItemData: function (aPageTag, aItemID)
  49.     {
  50.       if (!(aItemID in this.pageData[aPageTag].elementIDs))
  51.         this.pageData[aPageTag].elementIDs[aItemID] = new Object();
  52.       return this.pageData[aPageTag].elementIDs[aItemID];
  53.     }
  54.   }
  55.  
  56.   this.contentID    = aFrameID;
  57.  
  58.   wsm               = this;
  59.  
  60.   /** Element Handlers
  61.    *  Provides default get and set handler functions for supported
  62.    *  widgets. Clients can override or add new widgets.
  63.    **/
  64.   this.handlers     = {
  65.     menulist:
  66.       {  get: wsm.get_Menulist,    set: wsm.set_Menulist      },
  67.     radiogroup:
  68.       {  get: wsm.get_Radiogroup,  set: wsm.set_Radiogroup    },
  69.     checkbox:
  70.       {  get: wsm.get_Checkbox,    set: wsm.set_Checkbox      },
  71.     textbox:
  72.       {  get: wsm.get_Textbox,     set: wsm.set_Textbox       },
  73.     listitem:
  74.       {  get: wsm.get_Listitem,    set: wsm.set_Listitem      },
  75.     data:
  76.       {  get: wsm.get_Data,        set: wsm.set_Data          },
  77.     default_handler:
  78.       {  get: wsm.get_Default,     set: wsm.set_Default       }
  79.   }
  80.  
  81.   // extra attributes to scan and save.
  82.   this.attributes   = [];
  83. }
  84.  
  85. nsWidgetStateManager.prototype =
  86. {
  87.   get contentArea ()
  88.   {
  89.     return window.frames[this.contentID];
  90.   },
  91.  
  92.   savePageData: function (aPageTag, aWindow)
  93.   {
  94.     gCurrentWindow = aWindow || this.contentArea;
  95.       
  96.     if (!(aPageTag in this.dataManager.pageData))
  97.       return;
  98.  
  99.     if ("GetFields" in gCurrentWindow) {
  100.       // save page data based on user supplied function in content area
  101.       var dataObject = gCurrentWindow.GetFields();
  102.       if (dataObject)        
  103.         this.dataManager.pageData[aPageTag].userData = dataObject;
  104.     }
  105.  
  106.     // Automatic element retrieval. This is done in two ways.
  107.     // 1) if an element id array is present in the document, this is
  108.     //    used to build a list of elements to persist. <-- performant
  109.     // 2) otherwise, all elements with "wsm_persist" set to true
  110.     //    are persisted <-- non-performant.
  111.     var elements;
  112.     if ("_elementIDs" in gCurrentWindow) {
  113.       elements = [];
  114.       for (var i = 0; i < gCurrentWindow._elementIDs.length; i++) {
  115.         var elt = gCurrentWindow.document.getElementById(gCurrentWindow._elementIDs[i]);
  116.         if (elt)
  117.           elements[elements.length] = elt;
  118.         else {
  119.           // see bug #40329. People forget this too often, and it breaks Prefs
  120.           dump("*** FIX ME: '_elementIDs' in '" + gCurrentWindow.location.href.split('/').pop() +
  121.                "' contains a reference to a non-existent element ID '" +
  122.           gCurrentWindow._elementIDs[i] + "'.\n");
  123.         }
  124.       }
  125.     }
  126.     else 
  127.       elements = gCurrentWindow.document.getElementsByAttribute("wsm_persist", "true");
  128.  
  129.     for (var ii = 0; ii < elements.length; ii++) {
  130.       var elementID   = elements[ii].id;
  131.       var elementType = elements[ii].localName;
  132.  
  133.       // persist attributes
  134.       var get_Func = (elementType in this.handlers) ?
  135.       this.handlers[elementType].get :
  136.       this.handlers.default_handler.get;
  137.       this.dataManager.setItemData(aPageTag, elementID, get_Func(elementID));
  138.     }
  139.   },
  140.  
  141.   setPageData: function (aPageTag, aWindow)
  142.   {
  143.     gCurrentWindow = aWindow || this.contentArea;
  144.  
  145.     var pageData = this.dataManager.getPageData(aPageTag);
  146.     if ("SetFields" in gCurrentWindow)
  147.       gCurrentWindow.SetFields(pageData.userData)
  148.  
  149.     if (!('elementIDs' in pageData))
  150.       return;
  151.  
  152.     for (var elementID in pageData.elementIDs) {
  153.       var element = gCurrentWindow.document.getElementById(elementID);
  154.       if (element) {
  155.         var elementType = element.localName;
  156.         var set_Func = (elementType in this.handlers) ?
  157.           this.handlers[elementType].set :
  158.           this.handlers.default_handler.set;
  159.         set_Func(elementID, pageData.elementIDs[elementID]);
  160.       }
  161.     }
  162.   },
  163.  
  164.  
  165.   /** Widget Get/Set Function Implementations
  166.    *  These can be overridden by the client.
  167.    **/
  168.   generic_Set: function (aElement, aDataObject)
  169.   {
  170.     if (aElement) {
  171.       for (var property in aDataObject) {
  172.         if (property == "localname")
  173.           continue;
  174.         if (!aDataObject[property] && typeof aDataObject[property] == "boolean")
  175.           aElement.removeAttribute(property);
  176.         else
  177.           aElement.setAttribute(property, aDataObject[property]);
  178.       }
  179.       
  180.       if (!aElement.getAttribute("disabled","true"))
  181.         aElement.removeAttribute("disabled");
  182.     }
  183.   },
  184.  
  185.   generic_Get: function (aElement)
  186.   {
  187.     if (aElement) {
  188.       var dataObject = new Object();
  189.       var wsmAttributes = aElement.getAttribute("wsm_attributes");
  190.       var attributes = wsm.attributes;              // make a copy
  191.       if (wsmAttributes != "")
  192.         attributes.push(wsmAttributes.split(" "));  // modify the copy
  193.  
  194.       for (var i = 0; i < attributes.length; i++)
  195.         dataObject[attributes[i]] = aElement.getAttribute(attributes[i]);
  196.  
  197.       dataObject.localname = aElement.localName;
  198.       return dataObject;
  199.     }
  200.     return null;
  201.   },
  202.  
  203.   // <menulist>
  204.   set_Menulist: function (aElementID, aDataObject)
  205.   {
  206.     var element = gCurrentWindow.document.getElementById(aElementID);
  207.     // set all generic properties
  208.     wsm.generic_Set(element, aDataObject);
  209.     // set menulist specific properties
  210.     if ("value" in aDataObject) {
  211.       try {
  212.         element.value = aDataObject.value;
  213.       }
  214.       catch (ex) {
  215.         dump(aElementID + ", ex: " + ex + "\n");
  216.       }
  217.     }
  218.   },
  219.  
  220.   get_Menulist: function (aElementID)
  221.   {
  222.     var element     = gCurrentWindow.document.getElementById(aElementID);
  223.     // retrieve all generic attributes
  224.     var dataObject  = wsm.generic_Get(element);
  225.     // retrieve all menulist specific attributes
  226.     if (dataObject) {
  227.       dataObject.value = element.getAttribute("value");
  228.       return dataObject;
  229.     }
  230.     return null;
  231.   },
  232.  
  233.   // <radiogroup>
  234.   set_Radiogroup: function (aElementID, aDataObject)
  235.   {
  236.     var element = gCurrentWindow.document.getElementById(aElementID);
  237.     wsm.generic_Set(element, aDataObject);
  238.     if ("value" in aDataObject)
  239.       element.value = aDataObject.value;
  240.     if ("disabled" in aDataObject)
  241.       element.disabled = aDataObject.disabled;
  242.   },
  243.  
  244.   get_Radiogroup: function (aElementID)
  245.   {
  246.     var element = gCurrentWindow.document.getElementById(aElementID);
  247.     var dataObject = wsm.generic_Get(element);
  248.     if (dataObject) {
  249.       dataObject.value = element.getAttribute("value");
  250.       return dataObject;
  251.     }
  252.     return null;
  253.   },
  254.  
  255.   // <textbox>
  256.   set_Textbox: function (aElementID, aDataObject)
  257.   {
  258.     var element = gCurrentWindow.document.getElementById(aElementID);
  259.     wsm.generic_Set(element, aDataObject);
  260.   },
  261.  
  262.   get_Textbox: function (aElementID)
  263.   {
  264.     var element = gCurrentWindow.document.getElementById(aElementID);
  265.     var dataObject = wsm.generic_Get(element);
  266.     if (dataObject) {
  267.       dataObject.value = element.value;
  268.       return dataObject;
  269.     }
  270.     return null;
  271.   },
  272.  
  273.   // <checkbox>
  274.   set_Checkbox: function (aElementID, aDataObject)
  275.   {
  276.     var element = gCurrentWindow.document.getElementById(aElementID);
  277.     // Set generic properites. 
  278.     wsm.generic_Set(element, aDataObject);
  279.     // Handle reversed boolean values.
  280.     if ("checked" in aDataObject && element.hasAttribute("reversed"))
  281.       element.checked = !aDataObject.checked; 
  282.   },
  283.  
  284.   get_Checkbox: function (aElementID)
  285.   {
  286.     var element = gCurrentWindow.document.getElementById(aElementID);
  287.     var dataObject = wsm.generic_Get(element);
  288.     if (dataObject) {
  289.       var checked = element.checked;
  290.       dataObject.checked = element.getAttribute("reversed") == "true" ? !checked : checked;
  291.       return dataObject;
  292.     }
  293.     return null;
  294.   },
  295.  
  296.   // <listitem>
  297.   set_Listitem: function (aElementID, aDataObject)
  298.   {
  299.     var element = gCurrentWindow.document.getElementById(aElementID);
  300.     wsm.generic_Set(element, aDataObject);
  301.   },
  302.  
  303.   get_Listitem: function (aElementID)
  304.   {
  305.     var element = gCurrentWindow.document.getElementById(aElementID);
  306.     var dataObject = wsm.generic_Get(element);
  307.     if (dataObject) {
  308.       if (element.getAttribute("type") == "checkbox")
  309.         dataObject.checked = element.checked;
  310.       return dataObject;
  311.     }
  312.     return null;
  313.   },
  314.  
  315.   // <data>
  316.   set_Data: function (aElementID, aDataObject)
  317.   {
  318.     var element = gCurrentWindow.document.getElementById(aElementID);
  319.     wsm.generic_Set(element, aDataObject);
  320.     if ("value" in aDataObject)
  321.       element.setAttribute("value", aDataObject.value);
  322.   },
  323.  
  324.   get_Data: function (aElementID)
  325.   {
  326.     var element = gCurrentWindow.document.getElementById(aElementID);
  327.     var dataObject = wsm.generic_Get(element);
  328.     if (dataObject) {
  329.       dataObject.value = element.getAttribute("value");
  330.       return dataObject;
  331.     }
  332.     return null;
  333.   },
  334.  
  335.   // <default>
  336.   set_Default: function (aElementID, aDataObject)
  337.   {
  338.     var element = gCurrentWindow.document.getElementById(aElementID);
  339.     wsm.generic_Set(element, aDataObject);
  340.   },
  341.  
  342.   get_Default: function (aElementID)
  343.   {
  344.     var element = gCurrentWindow.document.getElementById(aElementID);
  345.     var dataObject = wsm.generic_Get(element);
  346.     return dataObject ? dataObject : null;
  347.   }
  348. }
  349.  
  350.  
  351.